# Create your views here.
'''
准备工作
    # QQ登录参数
    # 我们申请的 客户端id
    QQ_CLIENT_ID = '101474184'
    # 我们申请的 客户端秘钥
    QQ_CLIENT_SECRET = 'c6ce949e04e12ecc909ae6a8b09b637c'
    # 我们申请时添加的: 登录成功后回调的路径
    QQ_REDIRECT_URI = 'http://www.meiduo.site:8080/oauth_callback.html'
设置qq图标 点击来实现登陆  （前端工作 ）


根据oauth2.0获取code 和token
    对于应用来说
    1，获取Authorization Code
    2，通过Authorization Code  获取Token
    3，通过Token获取openid
    openid是此网站上唯一对应用户身份的标识，
    网站可将此ID进行存储便于用户下次登录时辨识其身份，或将其与用户在网站上的原有账号进行绑定。

openid和用户信息进行绑定



生成用户绑定连接======》获取code=====》获取token======》获取openid=====》保存openid
'''

'''
生成用户绑定连接------>用户点击了qq登陆按钮 发起axios请求  后端要生成一个链接



前端：    用户点击了qq登陆按钮 发起axios请求------>   qq/authorization/
        
后端：     
        请求
        业务逻辑          调用QQLoginTool生成跳转链接
        响应             返回跳转链接 Json{'code':0,'qq_login_url':'http://xxx'}
        路由     GET     /qq/authorization/
        步骤


'''

# qq/authorization/       点击qq登陆按钮
# ---------------------------------生成用户绑定链接

from django.http import JsonResponse
from django.views import View

from meiguo_mall import settings


class QQLoginView(View):
    def get(self, request):
        # 1.导入
        from QQLoginTool.QQtool import OAuthQQ

        # 2.初始化OAuthQQ对象

        qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI,  # 'http://www.meiduo.site:8080/oauth_callback.html'
                     state='xxxxxx')
        # 3.调用对象的方法 生成跳转链接
        # 生成跳转链接------>就是使用qq登陆的那个网页
        qq_login_url = qq.get_qq_url()

        # 如果用户成功登录并授权，则会跳转到指定的回调地址，并在redirect_uri地址后带上Authorization Code和原始的state值
        # http://www.meiduo.site:8080/oauth_callback.html?code=9A5F************************06AF&state=xxxxxx

        # 4.返回响应
        return JsonResponse({'code': 0, 'login_url': qq_login_url})  # 含有链接


'''
获取code

前端  
    获取用户同意登陆的code 把这个code发给后端
      发送一个get请求   http://www.meiduo.site:8080/oauth_callback/?code=xxxx
    

后端
    请求         获取code
    
    业务逻辑     通过code获取token  
                再通过token获取openid
                根据openid进行判断
                如果没有绑定  需要绑定
                如果已经绑定  直接登陆
    响应
    
    路由        GET  oauth_callback/?code=xxxx
    步骤： 
            1。获取code
            2。通过code获取token  
            3。再通过token获取openid
            4。根据openid进行判断
            5。如果没有绑定  需要绑定
            6。如果已经绑定  直接登陆
        
'''


# oauth_callback/?code=xxxx
# -----------------------------------------获取code=====》获取token======》获取openid
class OauthQQView(View):

    def get(self, request):
        # 1。获取code

        code = request.GET.get('code')
        if code is None:
            return JsonResponse({'code': 400, 'errmsg': '参数不全'})
        # 2。通过code获取token
        from QQLoginTool.QQtool import OAuthQQ
        qq = OAuthQQ(client_id=settings.QQ_CLIENT_ID, client_secret=settings.QQ_CLIENT_SECRET,
                     redirect_uri=settings.QQ_REDIRECT_URI,  # 'http://www.meiduo.site:8080/oauth_callback.html'
                     state='xxxxxx')
        token = qq.get_access_token(code=code)
        # 3。再通过token获取openid
        openid = qq.get_open_id(token)
        # 4。根据openid进行判断
        from apps.oauth.models import OAuthQQUser
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)  # 不存在测返回错误
        except OAuthQQUser.DoesNotExist:
            # 5。如果没有绑定
            # 需要绑定
            # 前端根据code跳转到注册页面
            # 对access_token进行加密
            from utils.its import generic_openid
            access_token = generic_openid(openid)
            res = JsonResponse({'code': 400, 'access_token': access_token})  # 把access_token 给前端
            return res

        else:
            # 6。如果已经绑定 直接登陆
            # 6。1设置session
            from django.contrib.auth import login
            login(request, qquser.user)  # ------>User类下的信息    用户信息
            # 6。2设置cookie
            # 前端根据code判断是否绑定 0 绑定   其他未绑定
            res = JsonResponse({'code': 0, 'errmsg': 'ok'})
            res.set_cookie('username', qquser.user.username)  # AbstractUser下的username
            return res

    def post(self, request):

        # 1。接收请求
        import json
        data = json.loads(request.body.decode())

        # 2。获取请求参数
        mobile = data.get('mobile')
        password = data.get('password')
        sms_code = data.get('sms_code')
        access_token = data.get('access_token')
        # image_code=data.get('image_code')  #用户输入的图片验证码
        #
        # 判断参数是否齐全
        # if not all([mobile, password, sms_code]):
        #     return JsonResponse({'code': 400, 'errmsg': '缺少必传参数'})
        # import re
        # # 判断手机号是否合法
        # if not re.match(r'^1[3-9]\d{9}$', mobile):
        #     return JsonResponse({'code': 400, 'errmsg': '请输入正确的手机号码'})
        # # 判断密码是否合格
        # if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
        #     return JsonResponse({'code': 400, 'errmsg': '请输入8-20位的密码'})
        # # 前端点击验证码图片时
        # # 发起请求 http://www.meiduo.site:8000/image_codes/<uuid>/
        # # 后端生成一个验证码
        # # 所以redis中会有uuid 和 text
        # # 进行判断就可以了
        # # 连接redis
        # # from django_redis import get_redis_connection
        # # redis_cli = get_redis_connection('code')
        # # redis_img_code = redis_cli.get(uuid)  # 这是在redis中uuid对应的验证码
        # -------------------------------------------------------------------------------------------------------------------
        # # 前端点击获取短信验证码  执行发送验证码的操作
        # #
        # # redis中有手机号对应的验证码
        # # 创建 redis 链接对象:
        # from django_redis import get_redis_connection
        # redis_conn = get_redis_connection('code')
        #
        # # 从 redis 中获取 sms_code 值:
        # sms_code_server = redis_conn.get('sms_%s' % mobile)
        #
        # # 判断获取出来的有没有:
        # if sms_code_server is None:
        #     # 如果没有, 直接返回:
        #     return JsonResponse({'code': 400,
        #                          'errmsg': '短信验证码失效'})
        # # 如果有, 则进行判断:
        # if sms_code != sms_code_server.decode():
        #     # 如果不匹配, 则直接返回:
        #     return JsonResponse({'code': 400,
        #                          'errmsg': '输入的短信验证码有误'})

        # 3。绑定   和User类中的手机号绑定
        from apps.users.models import User
        try:
            user = User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            # 手机号不存在
            # 手机号没注册  创建一个user信息 再绑定
            user = User.objects.create_user(username=mobile, mobile=mobile, password=password)

        else:
            # 手机号存在
            # 手机号注册过  直接绑定用户和openid
            if not user.check_password(password):
                return JsonResponse({'code': 400, 'errmsg': '密码不正确'})
        from apps.oauth.models import OAuthQQUser
        # 绑定openid和User.user   user=User.objects.get(mobile=mobile)

        # 用到了access_token 要进行解密
        from utils.its import check_access
        openid=check_access(access_token)
        if openid is None:
            return JsonResponse({'code':400,'errmsg':'参数缺失'})
        OAuthQQUser.objects.create(user=user, openid=openid)
        # 4。完成状态保持
        from django.contrib.auth import login
        login(request, user)
        res = JsonResponse({'code': 0, 'errmsg': 'ok'})
        res.set_cookie('username', user.username)
        return res
        # 5。返回响应


'''
绑定账号信息
    QQ（openid） 美多账号信息
前端：   检测到用户未绑定时候 跳转到绑定页面
        点击保存按钮 
        前端提交 手机号，密码，短信验证，openid     发送axios请求
        
后端：    
    请求：        接收请求，获取请求参数
    业务逻辑：    绑定，完成状态保持
    响应：        返回code:0
    路由：      POST    oauth_callback/
    
    步骤：
        1。接收请求
        2。获取请求参数
        3。绑定   和User类中的手机号绑定
            3。1 手机号注册过  直接绑定用户和openid
                3。1。1 判断密码是否正确
            3。2 手机号没注册  创建一个user信息 再绑定
        4。完成状态保持
        5。返回响应
'''

# -----------------itsdangerous的使用

#########加密数据
# 1。导入itsdangerous 的类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

# 2。创建类的实例对象
# secret_key       私钥
# expires_in=None  过期时间
s = Serializer(secret_key=settings.SECRET_KEY, expires_in=3600)
# 3。加密数据
token = s.dumps({'openid': '123'})
# b'eyJhbGciOiJIUzUxMiIsImlhdCI6MTYyMjc4MTM3OSwiZXhwIjoxNjIyNzg0OTc5fQ.eyJvcGVuaWQiOiIxMjMifQ.N_MUjqPac4ofz58lCfCfl5rOaGxkXEj9FnglY12nElD98AiZG2uT5hyj01DpfNRClkrnrSEuPDhWCehpcGLarg'
#########解密数据
s = Serializer(secret_key=settings.SECRET_KEY, expires_in=3600)
s.loads(token)  # {'openid': '123'}
